<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>13. Aufgaben &mdash; PowerShell fuer Systemintegratoren</title>
    
    <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    './',
        VERSION:     '1.0',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/underscore.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <script type="text/javascript" src="_static/translations.js"></script>
    <link rel="top" title="PowerShell fuer Systemintegratoren" href="index.html" />
    <link rel="next" title="14. Lösungen" href="Loesungen.html" />
    <link rel="prev" title="12. Objekte in der PS" href="powershell_customobjects.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Allgemeiner Index"
             accesskey="I">Index</a></li>
        <li class="right" >
          <a href="Loesungen.html" title="14. Lösungen"
             accesskey="N">weiter</a> |</li>
        <li class="right" >
          <a href="powershell_customobjects.html" title="12. Objekte in der PS"
             accesskey="P">zurück</a> |</li>
        <li><a href="index.html">PS4SYS</a> &raquo;</li> 
      </ul>
    </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <p class="logo"><a href="index.html">
              <img class="logo" src="_static/PowerShell_icon_small.png" alt="Logo"/>
            </a></p>
  <h3><a href="index.html">Inhalt</a></h3>
  <ul>
<li><a class="reference internal" href="#">13. Aufgaben</a><ul>
<li><a class="reference internal" href="#konsole">13.1. Konsole</a></li>
<li><a class="reference internal" href="#editormodus">13.2. Editormodus</a></li>
<li><a class="reference internal" href="#interaktivmodus">13.3. Interaktivmodus</a></li>
<li><a class="reference internal" href="#variable-und-datentyp">13.4. Variable_und_Datentyp</a></li>
<li><a class="reference internal" href="#operatoren">13.5. Operatoren</a></li>
<li><a class="reference internal" href="#aufgaben-zu-arrays">13.6. Aufgaben_zu_Arrays</a></li>
<li><a class="reference internal" href="#bedingungen">13.7. Bedingungen</a></li>
<li><a class="reference internal" href="#schleifen">13.8. Schleifen</a></li>
<li><a class="reference internal" href="#struktogramm">13.9. Struktogramm</a></li>
<li><a class="reference internal" href="#funktionen">13.10. Funktionen</a></li>
<li><a class="reference internal" href="#pipeline">13.11. Pipeline</a></li>
<li><a class="reference internal" href="#objekte">13.12. Objekte</a><ul>
<li><a class="reference internal" href="#aufgabe-1">13.12.1. Aufgabe 1</a></li>
<li><a class="reference internal" href="#aufgabe-2">13.12.2. Aufgabe 2</a></li>
<li><a class="reference internal" href="#aufgabe-3">13.12.3. Aufgabe 3</a></li>
</ul>
</li>
<li><a class="reference internal" href="#fehlerbehandlung">13.13. Fehlerbehandlung</a></li>
<li><a class="reference internal" href="#active-directory">13.14. Active Directory</a></li>
</ul>
</li>
</ul>

  <h4>Vorheriges Thema</h4>
  <p class="topless"><a href="powershell_customobjects.html"
                        title="vorheriges Kapitel">12. Objekte in der PS</a></p>
  <h4>Nächstes Thema</h4>
  <p class="topless"><a href="Loesungen.html"
                        title="nächstes Kapitel">14. Lösungen</a></p>
  <h3>Diese Seite</h3>
  <ul class="this-page-menu">
    <li><a href="_sources/Aufgaben.txt"
           rel="nofollow">Quelltext anzeigen</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Schnellsuche</h3>
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Los" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Geben Sie Suchbegriffe oder einen Modul-, Klassen- oder Funktionsnamen ein.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="aufgaben">
<h1>13. Aufgaben<a class="headerlink" href="#aufgaben" title="Permalink zu dieser Überschrift">¶</a></h1>
<div class="section" id="konsole">
<h2>13.1. Konsole<a class="headerlink" href="#konsole" title="Permalink zu dieser Überschrift">¶</a></h2>
<ul class="simple">
<li>Sie wollen, dass die Powershell automatisch im Administratormodus startet. Wie gehen Sie vor ?</li>
<li>Beim Ausführen eines Skriptes erhalten Sie eine Fehlermeldung &#8220;Execution policy ....&#8221;. Welche Bedeutung hat diese Meldung und wie können Sie den Fehler abstellen</li>
<li>Stellen Sie den Bildschirmhintergrund der Konsole auf Weiß und die Textfarbe auf Schwarz.</li>
<li>Wie können Sie die letzten Befehle einfach wiederholen ?</li>
<li>Was versteht man unter Tab-Vervollständigung</li>
<li>Suchen Sie die Hilfe zu Powershell in Form einer Online-Dokumentation</li>
<li>Wie lautet die Einstiegs-Website von Microsoft mit Informationen zur Powershell ?</li>
<li>Erläutern Sie die Befehlzeichen | und &gt;. Worin bestehen die Unterschiede ?</li>
<li>Wie kann man in der Powershell mehrzeilige Befehle eingeben ?</li>
</ul>
</div>
<div class="section" id="editormodus">
<h2>13.2. Editormodus<a class="headerlink" href="#editormodus" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Lösungen sind hier: <em class="xref std std-ref">loesung_powershell_editor</em>:</p>
</div>
<div class="section" id="interaktivmodus">
<h2>13.3. Interaktivmodus<a class="headerlink" href="#interaktivmodus" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Lösungen sind hier: <em class="xref std std-ref">loesung_interaktiv</em>:</p>
<ul>
<li><p class="first">Welche Aliase gibt es fÃ¼r das Get-ChildItem</p>
</li>
<li><p class="first">Finden Sie mit Hilfe von Get-Help heraus, wofÃ¼r das Cmdlet Stop-Process eingesetzt wird. Nutzen Sie die Hilfeinformationen, um mit Stop-Process alle Instanzen des Notepad-Editors zu schlieÃŸen. Wie lautet der korrekte Befehl.</p>
</li>
<li><p class="first">Versuchen Sie wie im vergangenen Beispiel mit Stop-Process einen Prozess zu beenden, der gar nicht vorhanden ist, erhalten Sie eine Fehlermeldung. Wie kann man diese Fehlermeldung unterdrÃ¼cken ?</p>
</li>
<li><p class="first">Nutzen Sie das Wissen Ã¼ber die Parameter von Write-Host dazu, um einen weiÃŸen Text auf rotem Grund auszugeben.</p>
</li>
<li><p class="first">Wie kann man sich die Parameter eines Cmdlets per get-help anzeigen lassen.</p>
</li>
<li><p class="first">Windows hat verschiedene EventLogs, welche man mit Hilfe des Cmdlets <strong>Get-Eventlog</strong> prinzipiell abfragen kann. Aber wie erhÃ¤lt man die Namen der Eventlogs, die man einsehen will.</p>
<p>Versuchen Sie es mit Hilfe von <strong>get-help get-eventlog</strong> herauszufinden.</p>
<p>Listen Sie sÃ¤mtliche EintrÃ¤ge des <strong>System</strong>-Eventlogs auf.</p>
</li>
</ul>
<img alt="_images/eventverwaltung.jpg" src="_images/eventverwaltung.jpg" />
<ul class="simple">
<li>Listen Sie nur die Ereignisse aus dem System-Ereignisprotokoll auf, die Fehler anzeigen. Schauen Sie sich dazu die Spalten an, die Get-EventLog liefert. Gibt es einen entsprechenden Parameter.</li>
<li>Listen Sie alle Error-EintrÃ¤ge des System-Ereignisprotokolls der letzten 24 Stunden auf Welche Parameter kÃ¶nnten den Zeitraum einschrÃ¤nken.</li>
<li>Listen Sie alle Error-EintrÃ¤ge der letzten 24 Stunden auf, ohne ein konkretes Datum eingeben zu mÃ¼ssen.</li>
<li>Listen Sie alle Error-EintrÃ¤ge eines anderen Computers der letzten 24 Stunden auf, ohne ein konkretes Datum eingeben zu mÃ¼ssen.</li>
</ul>
</div>
<div class="section" id="variable-und-datentyp">
<h2>13.4. Variable_und_Datentyp<a class="headerlink" href="#variable-und-datentyp" title="Permalink zu dieser Überschrift">¶</a></h2>
<ul>
<li><p class="first">Was ist das Ergebnis des folgenden Skriptes</p>
<div class="highlight-sh"><div class="highlight"><pre><span class="o">[</span>int<span class="o">]</span><span class="nv">$a</span> <span class="o">=</span> -7
<span class="o">[</span>int<span class="o">]</span><span class="nv">$b</span> <span class="o">=</span> 3
Write-Host<span class="o">(</span><span class="nv">$a</span>/<span class="nv">$b</span><span class="o">)</span>
Write-Host<span class="o">([</span>int<span class="o">](</span><span class="nv">$a</span>/<span class="nv">$b</span><span class="o">))</span>
</pre></div>
</div>
</li>
<li><p class="first">Welche Zeichen sind für das Erstellen eines Variablennamens möglich. Recherchieren Sie falls notwendig auch im Internet</p>
</li>
<li><p class="first">Welchen Unterschied macht es, ob sie als Kennzeichen für einen String das Zeichen &#8221; oder das Zeichen &#8216; einsetzen.</p>
</li>
<li><p class="first">Wie kann man erfahren, welcher Datentyp eine Variable bzw. ein Wert hat</p>
</li>
<li><p class="first">Sie möchten einen String als Datum weiterverwenden, falls er ein reguläres Datum ist.</p>
</li>
<li><p class="first">Welche Vorteile hat das Casten eines Strings in ein DateTime-Objekt</p>
</li>
<li><p class="first">Welche Wertebereiche kann eine als int16 deklarierte Variable aufnehmen.</p>
</li>
<li><p class="first">Wie löscht man eine Variable innerhalb einer Powershell-Sitzung</p>
</li>
<li><p class="first">Welche Variablen sind beim Start von Powershell bereits vorhanden ? Wie kann man sie sichtbar machen</p>
</li>
<li><p class="first">Folgender Quellcode ist vorhanden</p>
<div class="highlight-sh"><div class="highlight"><pre><span class="nv">$a</span> <span class="o">=</span> <span class="s2">&quot;Hello&quot;</span>
<span class="nv">$b</span> <span class="o">=</span> 123
</pre></div>
</div>
<ul class="simple">
<li>Bestimmen Sie die Länge des Wertes der Variable $a</li>
<li>An welcher Stelle im String kommt der Buchstabe &#8220;e&#8221; vor</li>
<li>Tauschen Sie den Buchstaben &#8216;e&#8217; durch den Buchstaben &#8216;a&#8217;</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="operatoren">
<h2>13.5. Operatoren<a class="headerlink" href="#operatoren" title="Permalink zu dieser Überschrift">¶</a></h2>
</div>
<div class="section" id="aufgaben-zu-arrays">
<h2>13.6. Aufgaben_zu_Arrays<a class="headerlink" href="#aufgaben-zu-arrays" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Lösungen sind hier: <em class="xref std std-ref">loesung_powershell_arrays</em>:</p>
<ul>
<li><p class="first">Schreiben Sie eine Funktion, die als Parameter einen Dateipfad erwartet und anschließend den Inhalt des Pfades ausgibt.</p>
</li>
<li><p class="first">Wie überprüfen Sie, ob ein Array einen bestimmten Wert enthält</p>
</li>
<li><p class="first">Wie überprüfen Sie, ob zwei Arrays gleich sind</p>
</li>
<li><p class="first">Ein String ist eigentlich ein Array aus Elementen des Datentyps CHAR.</p>
<blockquote>
<div><div class="highlight-sh"><div class="highlight"><pre><span class="nv">$test</span> <span class="o">=</span> <span class="s2">&quot;Hello&quot;</span>
<span class="nv">$test</span><span class="o">[</span>0<span class="o">]</span>.Gettype<span class="o">()</span>

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Char                                     System.ValueType
</pre></div>
</div>
<p>Die Ansprechen eines einzelnen Elementes ist auch mit $test[1] problemlos möglich. Wie können Sie aber ein einzelnes Element eines bestehenden Strings mit Hilfe der Array-Indiziierung ändern, also etwas so</p>
<div class="highlight-sh"><div class="highlight"><pre><span class="nv">$integerarray</span> <span class="o">=</span> 1,2,3
<span class="nv">$integerarray</span><span class="o">[</span>2<span class="o">]</span> <span class="o">=</span> 345  <span class="c"># geht</span>

<span class="nv">$test</span> <span class="o">=</span> <span class="s2">&quot;Hello&quot;</span>
<span class="nv">$test</span><span class="o">[</span>0<span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;F&quot;</span>                  <span class="c">#Fehlermeldung</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p class="first">Überprüfen sie, ob ein bestimmter Wert in einem Array enthalten ist, z.B.</p>
<blockquote>
<div><div class="highlight-sh"><div class="highlight"><pre><span class="nv">$arrColors</span> <span class="o">=</span> <span class="s2">&quot;blue&quot;</span>, <span class="s2">&quot;red&quot;</span>, <span class="s2">&quot;green&quot;</span>, <span class="s2">&quot;yellow&quot;</span>, <span class="s2">&quot;white&quot;</span>, <span class="s2">&quot;pink&quot;</span>, <span class="s2">&quot;orange&quot;</span>, <span class="s2">&quot;turquoise&quot;</span>
</pre></div>
</div>
<p>Prüfen Sie, ob der Wert &#8220;green&#8221; enthalten ist</p>
</div></blockquote>
</li>
<li><p class="first">Haben wir Elemente, die mit &#8220;bl&#8221; beginnen</p>
<blockquote>
<div><div class="highlight-sh"><div class="highlight"><pre><span class="nv">$arrColors</span> <span class="o">=</span> <span class="s2">&quot;blue&quot;</span>, <span class="s2">&quot;red&quot;</span>, <span class="s2">&quot;green&quot;</span>, <span class="s2">&quot;yellow&quot;</span>, <span class="s2">&quot;white&quot;</span>, <span class="s2">&quot;pink&quot;</span>, <span class="s2">&quot;orange&quot;</span>, <span class="s2">&quot;turquoise&quot;</span>, <span class="s2">&quot;black&quot;</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p class="first">Sortieren sie den obigen Array alphabetisch</p>
<blockquote>
<div><div class="highlight-sh"><div class="highlight"><pre><span class="nv">$arrColors</span> <span class="o">=</span> <span class="s2">&quot;blue&quot;</span>, <span class="s2">&quot;red&quot;</span>, <span class="s2">&quot;green&quot;</span>, <span class="s2">&quot;yellow&quot;</span>, <span class="s2">&quot;white&quot;</span>, <span class="s2">&quot;pink&quot;</span>, <span class="s2">&quot;orange&quot;</span>, <span class="s2">&quot;turquoise&quot;</span>, <span class="s2">&quot;black&quot;</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p class="first">Vergleichen Sie die Geschwindigkeit beim Erstellen und Suchen der folgenden Datenstrukturen: Array vs. Hashtable. Welches Ergebnis stellen Sie fest ?</p>
</li>
<li><p class="first">Sie besitzen eine Textdatei mit Familienname und Loginname der Firmenmitarbeiter. Sie umfasst 2000 Einträge und soll dazu hergenommen werden, um &#8220;vergessene&#8221; Loginnamen zu suchen. Überlegen Sie sich, wie Sie diese Textdatei innerhalb von Powershell-Skripten nutzen können.</p>
</li>
</ul>
</div>
<div class="section" id="bedingungen">
<h2>13.7. Bedingungen<a class="headerlink" href="#bedingungen" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Lösungen sind hier: <a class="reference internal" href="Loesungen.html#loesung-powershell-bedingungen"><em>Bedingungen</em></a>:</p>
<ul>
<li><p class="first">Mit welchen Vergleichsoperatoren können Sie in Bedingungen arbeiten ?</p>
</li>
<li><p class="first">Folgende Variablen sind gegeben:</p>
<blockquote>
<div><blockquote>
<div><div class="highlight-sh"><div class="highlight"><pre><span class="nv">$user</span> <span class="o">=</span> <span class="s1">&#39;steinam&#39;</span>
<span class="nv">$pass</span> <span class="o">=</span> <span class="s1">&#39;passwort&#39;</span>
</pre></div>
</div>
</div></blockquote>
<p>Formulieren Sie eine Bedingung in Powershell, die gleichzeitig nach einem korrekten Usernamen und Passwort fragt.</p>
</div></blockquote>
</li>
<li><p class="first">Mit Hilfe von WMI können Sie feststellen, welche Rolle ein Computer innerhalb einer Domäne spielt. Es gibt 6 verschiedene Rollen:</p>
<blockquote>
<div><ul class="simple">
<li>0 = Stand alone workstation</li>
<li>1 = Member Workstation</li>
<li>2 = Stand Alone Server</li>
<li>3 = Member Server</li>
<li>4 = Backup Domain Controller</li>
<li>5 = Primary Domain Controller</li>
</ul>
<p>Falls andere Werte zurückkommen, kann die Rolle nicht eindeutig definiert werden</p>
<p>Erstellen Sie ein Skript, welches die jeweilige Rolle in Textform ausgibt.</p>
</div></blockquote>
</li>
<li><p class="first">Drucker auf verschiedenen Betriebssystemen ermitteln</p>
<blockquote>
<div><p>Verschiedene Betriebssysteme nutzen manchmal unterschiedliche WMI Klassen und/oder Eigenschaften, so z.B. Windows XP, Windows 2003 und Windows 2000.
Sie wollen die auf diesen Betriebssystemen verwendeten Drucker auflisten und benötigen ein universell einsetzbares Skript.
Verwenden Sie ein if-Statement zum Ermitteln der korrekten OS-Version und verwenden Sie den dafür vorgesehenen Code.</p>
<p>Benutzen Sie die WMI-Klasse win32_OperatingSystem zum Ermitteln der OS-Version sowie win32_Printer auf XP und 2003 und win32_PrintJob auf Win2000-Systemen</p>
</div></blockquote>
</li>
<li><p class="first">Schreiben Sie eine Anwendung, die nach Eingabe einer ganzen Zahl ausgibt, ob
die Zahl gerade (restlos durch 2 teilbar, Modulo!) ist oder nicht.</p>
</li>
<li><p class="first">Schreiben Sie eine Anwendung, die nach Eingabe zweier Zahlen ausgibt, welche
der beiden Zahlen die größere und welche die kleinere der beiden ist.</p>
</li>
<li><p class="first">Erweitern Sie die Anwendung um das Erkennen der Gleichheit der beiden
Eingaben.</p>
</li>
<li><p class="first">Schreiben Sie eine Anwendung, die ermittelt, ob eine Kreditantrag aufgrund des
Alters des Antragstellers in eine besondere Prüfung muss. Ist der Antragsteller nicht volljährig oder schon älter oder gleich 65 Jahre, soll eine Meldung ausgegeben werden. Falls das Alter dazwischen liegt, soll eine entsprechende Meldung ausgegeben werden.</p>
</li>
<li><p class="first">Schreiben Sie eine Anwendung, die zu einer eingegebenen Zahl den Kehrwert
ausgibt. Der Wert muss auf Plausibilität überprüft werden!</p>
</li>
<li><p class="first">Schreiben Sie eine Anwendung, die zu einer Eingabe den Absolutwert ausgibt.</p>
</li>
<li><p class="first">Schreiben Sie eine Anwendung, die nach Eingabe zweier Zahlen vom Anwender die
Summe, die Differenz, das Produkt und den Quotienten anfragt. Anschließend soll ausgegeben werden, welche Antwort falsch oder richtig waren (im Fehlerfall mit Lösung) und wie viel Prozent der Antworten richtig waren. Vergessen Sie nicht die Plausibilitätsprüfung der Eingaben (Division!).</p>
</li>
</ul>
</div>
<div class="section" id="schleifen">
<h2>13.8. Schleifen<a class="headerlink" href="#schleifen" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Lösungen sind hier <a class="reference internal" href="Loesungen.html#loesung-powershell-schleifen"><em>Schleifen</em></a>:</p>
<ul>
<li><dl class="first docutils">
<dt><strong>Ping</strong></dt>
<dd><p class="first last">Schreiben Sie eine Programm, welches Ihnen alle per PING erreichbaren Rechner eines Netzes ermittelt. Das Programm soll alle Adressen von 1 bis 255 pingen. Wenn ein PING erfolgreich war, soll dies als Ausgabe angezeigt werden.</p>
</dd>
</dl>
</li>
<li><p class="first"><strong>ZahlenRaten</strong></p>
<blockquote>
<div><p>Erstellen sie ein Skript, welches folgende Aufgabe erfüllt: Es muss eine Meldung anzeigen, in der der Benutzer aufgefordert wird, eine Zahl zwischen 1 und 50 einzugebeenn. Das Skript muss die vom Benutzer eingegebene Zahl mit einer zufällig generierten Zahl vergleichen. Wenn die Zahlen nicht übereinstimmen, muss das Skript eine Meldung anzeigen, in der angegeben wird, ob die geratene Zahl zu hoch oder zu niedrig war, und der Benutzer aufgefordert wird, noch einmal zu raten.</p>
<p>Wenn der Benutzer richtig rät, muss das Skript die Zufallszahl sowie die Anzahl der Rateversuche anzeigen. An diesem Punkt ist das Spiel beendet, das Skript muss also auch beendet werden.</p>
</div></blockquote>
</li>
<li><p class="first"><strong>Dateien kopieren</strong></p>
<blockquote>
<div><p>Diese Skripts sollen folgende Aufgaben ausführen:</p>
<ul class="simple">
<li>Durchsuchen des Ordners &#8220;C:Scripts&#8221; und dessen Unterordnern.</li>
<li>Durchsuchen jedes Ordners nach sämtlichen Textdateien (Dateien mit der Erweiterung .txt) und Prüfen des Erstellungsdatums jeder Datei.</li>
<li>Kopieren/Verschieben jeder .txt-Datei, die mehr als 10 Tage zuvor erstellt wurde, in den Ordner &#8220;C:Old&#8221;.</li>
<li>Ausgeben des Dateinamens (kein vollständiger Pfad, nur Dateiname) jeder kopierten Datei.</li>
<li>Ausgeben der Anzahl der kopierten Dateien.</li>
</ul>
</div></blockquote>
</li>
<li><p class="first"><strong>Fonts im System ermitteln</strong></p>
<blockquote>
<div><p>Bei dieser Aufgabe möchten wir herausfinden, welche Schriftarten auf einem Computer installiert sind. Wir geben Ihnen einen Hinweis: Die Schriftarten sind in der Registrierung unter HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersion gespeichert. Ihr Skript soll jedoch nicht alle Schriftarten auslesen, sondern nur die TrueType-Schriftarten. Wie können Sie eine TrueType-Schriftart von einer anderen Schriftart unterscheiden? Das ist leicht: In der Registrierung sind TrueType-Schriftarten durch den Ausdruck TrueType in Klammern direkt nach dem Schriftartnamen gekennzeichnet. Eine TrueType-Schriftart sieht also wie folgt aus:
<em>Bauhaus 93 (TrueType)</em></p>
<p>Zur Lösung dieser Aufgabe muss Ihr Skript Folgendes ausgeben:</p>
<ul class="simple">
<li>Die Namen aller TrueType-Schriftarten auf dem Computer.</li>
<li>Die Anzahl der TrueType-Schriftarten auf dem Computer.</li>
<li>Die Gesamtanzahl der Schriftarten auf dem Computer.</li>
</ul>
<p>Das Ergebnis sollte in etwa so aussehen:</p>
<div class="highlight-sh"><div class="highlight"><pre>Lucida Bright <span class="o">(</span>TrueType<span class="o">)</span>
Lucida Bright Demibold <span class="o">(</span>TrueType<span class="o">)</span>
Lucida Bright Demibold Italic <span class="o">(</span>TrueType<span class="o">)</span>
Lucida Bright Italic <span class="o">(</span>TrueType<span class="o">)</span>
Lucida Calligraphy Italic <span class="o">(</span>TrueType<span class="o">)</span>
Lucida Fax Regular <span class="o">(</span>TrueType<span class="o">)</span>

TrueType: 419
Total: 451
</pre></div>
</div>
</div></blockquote>
</li>
<li><p class="first"><strong>Schleifen optimieren</strong></p>
<blockquote>
<div><p>Die Ausgabe des folgenden Powershell-Befehls dauert u.U. sehr lange. Verbessern Sie das Statement im Hinblick auf die Auführungsgeschwindigkeit</p>
<div class="highlight-sh"><div class="highlight"><pre><span class="c"># Foreach loop lists each element in a collection:</span>
Foreach <span class="o">(</span><span class="nv">$element</span> in Dir C:<span class="se">\ </span>-recurse<span class="o">)</span> <span class="o">{</span> <span class="nv">$element</span>.name <span class="o">}</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p class="first"><strong>Dateien per ftp hochladen</strong></p>
<blockquote>
<div><p>Sie sollen alle Dateien eines zu spezifizierenden Ordners auf einen ftp-server hochladen. Übergeben Sie den Ordnernamen auf der Kommandozeile,</p>
</div></blockquote>
</li>
<li><p class="first"><strong>Übersicht über laufende Dienste</strong></p>
<blockquote>
<div><p>Verschaffen Sie sich einen Überblick über die laufenden Prozesse. Falls die Prozesse einen bestimmten Namen besitzen, stoppen Sie diese Prozesse bzw. geben das Wort &#8220;Gefunden &lt;Dienstname&gt; aus.</p>
<p>Erweitern Sie das Skript, indem Sie die laufenden Dienste in eine Datei schreiben, um sie später wie oben bereits geschehen, auszuwerten. Welche Schwierigkeiten können bei diesem Vorhaben auftreten.</p>
</div></blockquote>
</li>
<li><p class="first"><strong>Schätzen der Festplattenauslastung</strong></p>
<blockquote>
<div><p>Wie lange wird der Speicherplatz einer Festplatte ausreichen, wenn ihr Inhalt jeden Monat um ca. 7,5% wächst. Die Platte hat eine Kapazität von 2 TBiT, eine Startbelegung von 100 MBiT</p>
</div></blockquote>
</li>
<li><p class="first"><strong>Berechnung des Notendurchnschnitts und Notenverteilung eines Testes</strong></p>
<blockquote>
<div><p>Ein Test ergab folgende Einzelnoten:
6,3,4,2,1,2,3,4,1,2,3,2,1,3,4,5,3,5,4,3,2,2,2,1,2,3</p>
<p>Berechnen Sie die Anzahl jeder Note sowie den Durchschnitt</p>
</div></blockquote>
</li>
</ul>
</div>
<div class="section" id="struktogramm">
<h2>13.9. Struktogramm<a class="headerlink" href="#struktogramm" title="Permalink zu dieser Überschrift">¶</a></h2>
<p><em class="xref std std-ref">loesung_struktogramm</em>:</p>
<p>ZwiPruef: Frühjahr 2008</p>
<ul>
<li><p class="first">Die alten Daten der Bims &amp; Beton AG sollen in eine neue Datenbank übernommen
werden. Das neue Datumsformat = JJJ-MM-TT, das alte TT.MM.JJ. (T=Tag, M=Monat, J=Jahr)</p>
<p>Die vorhandenen Daten reichen von 1940 bis 2010, daher sollen alle Jahreszahlen &lt;= 10 mit einer &#8220;20&#8221; und alle Jahreszahlen &gt; 10 mit einer &#8220;19&#8221; ergänzt werden. Dazu wurde nebenstehender Algorithmus entwickelt.</p>
<img alt="_images/strukto_bims.png" src="_images/strukto_bims.png" />
<div class="admonition note">
<p class="first admonition-title">Bemerkung</p>
<ul class="simple">
<li>Die Funktion ctoi wandelt ein n.Zeichen einer Zeichenkette in eine Zahl um</li>
<li>Die Zeichenkette beginnt mit dem Index 0</li>
</ul>
<ol class="last loweralpha simple">
<li>Eine der im Struktogramm mit 1,2,4,6 oder 7 gekennzeichneten Stellen stellt eine Bedingung dar. Welche ?</li>
<li>Das Struktogramm enthät an einer der mit 1,3,5,6 oder 8 gekennzeichneten Stellen einen Fehler.</li>
</ol>
</div>
</li>
<li><p class="first">Viele der von der Softplus GmbH für die Maschinenbau AG entwickelten Programme enthalten kopfgesteuerte Schleifen. Welche Aussage ist richtig:</p>
<blockquote>
<div><ol class="arabic simple">
<li>Bei einer kopfgesteuerten Schleife wird die Anzahl der Durchläufe automatisch berechnet</li>
<li>Eine kopfgesteuerte Schleife wird mindestens einmal durchlaufen</li>
<li>Ein kopfgesteuerte Schleife kann nur durch eine Sprungsanweisung verlassen werden</li>
<li>Wurde eine kopfgesteuerte Schleife einmal durchlaufen, wird die Bedingung nicht mehr geprüft</li>
<li>Eine kopfgesteuerte Schleife wird nicht durchlaufen, wenn die Bedingung nicht erfüllt ist</li>
</ol>
</div></blockquote>
</li>
<li><p class="first">Die Softplus GmbH soll eine Software erstellen, mit der die für Projekte geleisteten Arbeitsstunden je Projekt ermittelt werden können. Die Arbeitsstunden für Projekte werden täglich in der Datei &#8220;Arbeitsstunden&#8221; gespeichert, deren Datensätze nach Projektnummern <strong>aufsteigend sortiert</strong> sind. Es sollen die Projekte aufgelistet erden, für die insgesamt mehr als 20 Arbeitsstunden geleistet wurden. Ein entsprechendes Programmodul wurde bereits nach unten stehendem Struktogramm erstellt. Ein Test zeigt, dass die Schleifenkopfbedingung &#8220;PRJNR := HPRJNR und nicht EOF&#8221; nicht zu dem geünschten Ergebnis führt.</p>
<blockquote>
<div><p>Welche der folgenden Bedingungen ist geeignet ?</p>
<ol class="arabic simple">
<li>PRJNR = HPRJNR und nicht EOF</li>
<li>PRJNR = HPRJNR oder nicht EOF</li>
<li>PRJNR = HPRJNR oder EOF</li>
<li>PRJNR &lt;&gt; HPRJNR und nicht EOF</li>
<li>PRJNR &lt;&gt; HPRJNR oder nicht EOF</li>
<li>PRJNR &lt;&gt; HPRJNR oderEOF</li>
</ol>
</div></blockquote>
</li>
</ul>
<img alt="_images/struktogramm_arbeitsstunden.png" src="_images/struktogramm_arbeitsstunden.png" />
<ul>
<li><p class="first">Die Softplus GmbH soll für das Warenwirtschaftssystem der Maschinenbau AG ein
Programm zur Prüfung des Lagerbestands erstellen. Der IST-&#8220;Ablauf der Lagerbestandsprüfung wird von einem Mitarbeiter der Maschinenbau AG wie folgt geschildert:</p>
<p>&#8220;Ein Programm gleict wöchentlich die Bestandsdaten mit den Buchungsdaten ab und protokolliert Abweichungen in einer Fehlerliste. Ich bearbeite diese Fehlerliste und gebe die Korrekturen über die PC-Tastatur in das System ein. Danach ermittelt ein Programm die Lagerteile, bei denen der Meldebestand erreicht wurde, erzeugt Bestellungen im System und druckt Bestellschreiben.</p>
<p>Vervollständigen Sie nebenstehenden Datenflussplan zum IST-Ablauf der Lagerbestandsprüfung, indem Sie das jeweilige Symbol den Positionen a) b) und c) zuordnen. Zur Bedeutung der Symbole informieren Sie sich bei wikipedia.</p>
<img alt="_images/dfplan_symbole.png" src="_images/dfplan_symbole.png" />
<img alt="_images/datenflussplan.png" src="_images/datenflussplan.png" />
</li>
</ul>
</div>
<div class="section" id="funktionen">
<h2>13.10. Funktionen<a class="headerlink" href="#funktionen" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Lösungen sind hier: <a class="reference internal" href="Loesungen.html#loesung-powershell-funktionen"><em>Funktionen</em></a>:</p>
<ul>
<li><p class="first">Schreiben Sie eine Funktion, die als Parameter einen Pfad erwartet und anschließend den Inhalt des Pfades ausgibt. Lösung ist hier <em class="xref std std-ref">loesung_dir</em>.</p>
</li>
<li><p class="first">Erweitern Sie die obige Funktion um eine rekursive Variante. Sollte der Pfad Unterordner besitzen, sollen auch diese ausgegeben werden. <em class="xref std std-ref">loesung_dir_rekursiv</em></p>
</li>
<li><p class="first">Erweitern Sie die obige Funktion: Es soll jetzt möglich sein, nach bestimmten Dateikennungen die Ausgabe zu gestalten. <em class="xref std std-ref">loesung_dir_rekursiv_extension</em></p>
</li>
<li><p class="first">Wie überprüfen Sie, ob ein Array einen bestimmten Wert enthält</p>
</li>
<li><dl class="first docutils">
<dt>Wie überprüfen Sie, ob zwei Arrays gleich sind</dt>
<dd><p class="first">Folgende Funktion überprüft zwei Arrays auf Gleichheit</p>
<div class="last highlight-sh"><div class="highlight"><pre><span class="k">function </span>AreArraysEqual<span class="o">(</span><span class="nv">$a1</span>, <span class="nv">$a2</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="nv">$a1</span> -isnot <span class="o">[</span>array<span class="o">]</span> -or <span class="nv">$a2</span> -isnot <span class="o">[</span>array<span class="o">])</span> <span class="o">{</span>
          throw <span class="s2">&quot;Both inputs must be an array&quot;</span>
        <span class="o">}</span>
        <span class="k">if</span> <span class="o">(</span><span class="nv">$a1</span>.Rank -ne <span class="nv">$a2</span>.Rank<span class="o">)</span> <span class="o">{</span>
          <span class="k">return</span> <span class="nv">$false</span>
        <span class="o">}</span>
        <span class="k">if</span> <span class="o">([</span>System.Object<span class="o">]</span>::ReferenceEquals<span class="o">(</span><span class="nv">$a1</span>, <span class="nv">$a2</span><span class="o">))</span> <span class="o">{</span>
          <span class="k">return</span> <span class="nv">$true</span>
        <span class="o">}</span>
        <span class="k">for</span> <span class="o">(</span><span class="nv">$r</span> <span class="o">=</span> 0; <span class="nv">$r</span> -lt <span class="nv">$a1</span>.Rank; <span class="nv">$r</span>++<span class="o">)</span> <span class="o">{</span>
          <span class="k">if</span> <span class="o">(</span><span class="nv">$a1</span>.GetLength<span class="o">(</span><span class="nv">$r</span><span class="o">)</span> -ne <span class="nv">$a2</span>.GetLength<span class="o">(</span><span class="nv">$r</span><span class="o">))</span> <span class="o">{</span>
                        <span class="k">return</span> <span class="nv">$false</span>
          <span class="o">}</span>
        <span class="o">}</span>

        <span class="nv">$enum1</span> <span class="o">=</span> <span class="nv">$a1</span>.GetEnumerator<span class="o">()</span>
        <span class="nv">$enum2</span> <span class="o">=</span> <span class="nv">$a2</span>.GetEnumerator<span class="o">()</span>

        <span class="k">while</span> <span class="o">(</span><span class="nv">$enum1</span>.MoveNext<span class="o">()</span> -and <span class="nv">$enum2</span>.MoveNext<span class="o">())</span> <span class="o">{</span>
          <span class="k">if</span> <span class="o">(</span><span class="nv">$enum1</span>.Current -ne <span class="nv">$enum2</span>.Current<span class="o">)</span> <span class="o">{</span>
                        <span class="k">return</span> <span class="nv">$false</span>
          <span class="o">}</span>
        <span class="o">}</span>
        <span class="k">return</span> <span class="nv">$true</span>
<span class="o">}</span>
</pre></div>
</div>
</dd>
</dl>
</li>
<li><p class="first">Folgendes Powershell-Skript berechnet den Wochentag mit Hilfe eines eigenen Algorithmus. Verbessern Sie die Lesbarkeit des Skriptes, indem Sie die verschiedenen Teile des Quellcode mit Hilfe von Funktionen kapseln.</p>
<blockquote>
<div><div class="highlight-sh"><div class="highlight"><pre><span class="c">#Berechnung des Wochentags</span>

<span class="o">[</span>int<span class="o">]</span><span class="nv">$t</span> <span class="o">=</span> Read-Host -prompt <span class="s2">&quot;Geben Sie einen Tag ein&quot;</span>
<span class="o">[</span>int<span class="o">]</span><span class="nv">$m</span> <span class="o">=</span> Read-Host -prompt <span class="s2">&quot;Geben Sie einen Monat ein&quot;</span>

<span class="nv">$MerkeMonat</span> <span class="o">=</span> <span class="nv">$m</span>;

<span class="o">[</span>int<span class="o">]</span><span class="nv">$j</span> <span class="o">=</span> Read-Host -prompt <span class="s2">&quot;Geben Sie das Jahr ein&quot;</span>

<span class="k">if</span><span class="o">(</span><span class="nv">$m</span> -le 2<span class="o">)</span>
<span class="o">{</span>
        <span class="nv">$m</span> +<span class="o">=</span> 10;
        <span class="nv">$j</span> -<span class="o">=</span> 1;
<span class="o">}</span>
<span class="k">else</span>
<span class="o">{</span>
        <span class="nv">$m</span> -<span class="o">=</span> 2;
<span class="o">}</span>

<span class="o">[</span>int<span class="o">]</span><span class="nv">$c</span> <span class="o">=</span> <span class="nv">$j</span>/100;
<span class="o">[</span>int<span class="o">]</span><span class="nv">$y</span> <span class="o">=</span> <span class="nv">$j</span>%100;

<span class="o">[</span>int<span class="o">]</span><span class="nv">$h</span> <span class="o">=</span> <span class="o">(((</span>26 * <span class="nv">$m</span> -2<span class="o">)</span>/10<span class="o">)</span> + <span class="nv">$t</span> + <span class="nv">$y</span> + <span class="nv">$y</span>/4 + <span class="nv">$c</span>/4 -2 * <span class="nv">$c</span><span class="o">)</span>%7

<span class="k">if</span><span class="o">(</span><span class="nv">$h</span> -lt 0<span class="o">)</span>
<span class="o">{</span>
        <span class="nv">$h</span> +<span class="o">=</span>7;
<span class="o">}</span>

<span class="o">[</span>string<span class="o">]</span><span class="nv">$Tag</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>;
switch<span class="o">(</span><span class="nv">$h</span><span class="o">)</span>
<span class="o">{</span>
        0 <span class="o">{</span> <span class="nv">$Tag</span> <span class="o">=</span> <span class="s2">&quot;Sonntag&quot;</span>; <span class="nb">break</span><span class="o">}</span>

        1 <span class="o">{</span> <span class="nv">$Tag</span> <span class="o">=</span> <span class="s2">&quot;Montag&quot;</span>; <span class="nb">break</span><span class="o">}</span>

        2 <span class="o">{</span> <span class="nv">$Tag</span> <span class="o">=</span> <span class="s2">&quot;Dienstag&quot;</span>; <span class="nb">break</span><span class="o">}</span>

        3 <span class="o">{</span> <span class="nv">$Tag</span> <span class="o">=</span> <span class="s2">&quot;Mittwoch&quot;</span>; <span class="nb">break</span><span class="o">}</span>

        4 <span class="o">{</span> <span class="nv">$Tag</span> <span class="o">=</span> <span class="s2">&quot;Donnerstag&quot;</span>;<span class="nb">break</span><span class="o">}</span>

        5 <span class="o">{</span> <span class="nv">$Tag</span> <span class="o">=</span> <span class="s2">&quot;Freitag&quot;</span>; <span class="nb">break</span><span class="o">}</span>

        6 <span class="o">{</span> <span class="nv">$Tag</span> <span class="o">=</span> <span class="s2">&quot;Samstag&quot;</span>; <span class="nb">break</span><span class="o">}</span>
<span class="o">}</span>

Write-Host <span class="s2">&quot;Der &quot;</span> + <span class="nv">$t</span> +<span class="s2">&quot;.&quot;</span> + <span class="nv">$MerkeMonat</span> + <span class="s2">&quot;.&quot;</span> + <span class="nv">$j</span> + <span class="s2">&quot; ist ein &quot;</span> + <span class="nv">$Tag</span>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p class="first">Schreiben Sie eine Funktion, die ihnen die Größe des vorhandenen physikalischen und virtuellen RAMs ausgibt. Benutzen Sie zum Ermitteln der Größe die WMI-Klasse WIN32_OperatingSystem und deren Eigenschaften <strong>FreePhysicalMemory</strong> sowie <strong>FreeVirtualMemory</strong>. Als kleine &#8220;Zugabe&#8221; möchten Sie die Angabe der Größe in verschiedenen Formaten (Byte, KByte, MByte) ermöglichen.</p>
</li>
<li><p class="first">Schreiben Sie eine Funktion zum Umbenennen eines Computernamens. Der Name soll entweder per Eingabeaufforderung übergeben werden können oder aus einer Textdatei gelesen werden, falls keine Eingabe vorgenommen wird. Kommentieren Sie die Funktion über die Powershell-typische Hilfesyntax. Prüfen Sie innerhalb der Funktion, ob Sie überhaupt die administrativen Rechte für die Umbenennung haben. Zum Abschluss des Vorgangs müssen Sie einen Reboot vornehmen.</p>
</li>
<li><dl class="first docutils">
<dt>Powershell kann mit Hilfe des CommandLets <strong>Get-Eventlog</strong> die Ereignisanzeige von lokalen und remote-Computern anzeigen und filtern. Schreiben Sie eine Funktion <em>getLogInfos</em>, die Ihnen folgende Auswahlmöglichkeiten zulässt:</dt>
<dd><ul class="first simple">
<li>Wahl des Computers</li>
<li>Wahl des jeweiligen EventLogs</li>
<li>Wahl des jeweiligen Eintrags, z.B. Error, Warnig, Information</li>
</ul>
<p class="last">Informieren Sie sich mit Hilfe von get-help über die weiteren Möglichkeiten von Get-Eventlog</p>
</dd>
</dl>
</li>
<li><p class="first">Verändern von Attributen einer Datei</p>
<p>Sie haben als Administrator einige Dateien, auf die sie von Zeit zu Zeit zugreifen müssen. Um die Dateien vor versehentlichen Änderungen zu schützen, versehen Sie diese mit ReadOnly - Flag. Leider ist aber jetzt ein Bearbeiten dieser Dateien mühsam, weil Sie nun immer erst dieses Flag ändern müssen.</p>
<p>Schreiben Sie ein parametrisiertes Skript, welches alle Dateien eines Ordners ReadOnly bzw. Nicht-ReadOnly setzen kann. Schreiben Sie zusätzlich eine Funktion, die Ihnen alle Dateien mit ReadOnly-Flag auflistet.
Eine Hilfe-Funktion soll Sie bei einer falschen Eingabe unterstützen.</p>
</li>
<li><p class="first">Ein Außendienstmitarbeiter erhält ein neues Firmen-Laptop. Auf seinem alten Laptop sind viele WLAN-Profile gespeichert und Sie suchen einen Weg, um diese Profile auf den neuen Rechner ohne manuelles Neuanlegen zu übernehmen. Ein Kollege erzählt Ihnen, dass Sie mit Hilfe des Befehls netsh Profile sowie exportieren als auch importieren können.
- Informieren Sie sich über die Möglichkeiten des Befehls netsh
- Schreiben Sie ein Skript, welches sowohl den Export als auch den Import der WLAN-Profile ermöglicht.</p>
</li>
<li><p class="first">Kommentieren Sie die Elemente des folgenden Quellcodes</p>
<blockquote>
<div><div class="highlight-sh"><div class="highlight"><pre>
</pre></div>
</div>
</div></blockquote>
</li>
<li><p class="first">Aufruf von Remote-Desktop-Sitzungen</p>
<blockquote>
<div><p>Erstellen Sie ein Skript, welches eine rdp-Verbindung unter Berücksichtigung verschiedener Optionen des mstsc-Befehls ermöglicht.</p>
</div></blockquote>
</li>
<li><p class="first">Setzen Sie mit Hilfe der PS die IP-Adresse eines Rechners. Geben Sie auch die Daten für Gateway, SN-Mask, NIC, DNS-Server</p>
</li>
<li><p class="first">Mit Hilfe des Befehls net view \UNC-Name können Sie die Freigaben eines Rechners ermitteln. Schreiben Sie eine Funktion, die als Parameter einen UNC-Namen und einen speziellen Freigabetyp erwartet. Die Funktion soll dann die gefundenen Freigaben zurückgeben.</p>
</li>
<li><p class="first">Programmieren eines HangMan-Spiels</p>
<blockquote>
<div><p>Okay, it is time to turn your attention back to the chapter’s main game project, the PowerShell Hangman game. The PowerShell Hangman game is a word guessing game in which the player is challenged to guess a randomly selected secret word, a letter at a time. To win, the player must guess each letter in the word in 12 guesses or fewer.</p>
<p>The overall construction of the PowerShell Hangman game will be completed in 11 steps, as outlined here:</p>
<ol class="arabic">
<li><p class="first">Create a new script file using the PowerShell script template.</p>
</li>
<li><p class="first">Define and initialize game variables in the Initialization Section.</p>
</li>
<li><p class="first">Define functions located in the Functions and Filters Section.</p>
</li>
<li><p class="first">Prompt the player for permission to play the game.</p>
</li>
<li><dl class="first docutils">
<dt>Create a loop to control overall gameplay.</dt>
<dd><ol class="first last arabic simple">
<li>Randomly select the game’s secret word.</li>
<li>Create a loop to control the collection and analysis of player input.</li>
<li>Collect and validate player guesses.</li>
<li>Display the result of each guess.</li>
<li>Determine when the game is over.</li>
<li>Challenge the player to play again.</li>
</ol>
</dd>
</dl>
</li>
</ol>
</div></blockquote>
</li>
</ul>
</div>
<div class="section" id="pipeline">
<h2>13.11. Pipeline<a class="headerlink" href="#pipeline" title="Permalink zu dieser Überschrift">¶</a></h2>
<p>Lösungen sind hier <a class="reference internal" href="Loesungen.html#loesung-powershell-pipeline"><em>Pipeline</em></a>:</p>
<ul>
<li><p class="first">You need a report of the top consumers of virtual memory and RAM on a server.</p>
</li>
<li><p class="first">You need a report of the largest files in a subtree.</p>
</li>
<li><p class="first">Die Ausgabe des folgenden Powershell-Befehls dauert u.U. sehr lange. Verbessern Sie das Statement im Hinblick auf die Ausführungsgeschwindigkeit</p>
<div class="highlight-sh"><div class="highlight"><pre><span class="c"># Foreach loop lists each element in a collection:</span>
    Foreach <span class="o">(</span><span class="nv">$element</span> in Dir C:<span class="se">\ </span>-recurse<span class="o">)</span> <span class="o">{</span> <span class="nv">$element</span>.name <span class="o">}</span>
</pre></div>
</div>
</li>
<li><p class="first">Welche Alias gibt es für das CmdLet get-process</p>
</li>
<li><p class="first">Welche Prozesse belegen mehr als 20 MByte</p>
</li>
<li><p class="first">Sortieren Sie das obige Ergebnis nach der Größe</p>
</li>
<li><p class="first">Geben Sie die Firma, den Produkt, Namen und Version der laufenden Prozesse aus</p>
</li>
<li><p class="first">Ermitteln Sie alle Word-Dateien im Verzeichnis h:Daten und seinen  Unterverzeichnissen. Beschränken Sie die Ergebnismenge auf diejenigen Objekte, bei denen das Attribut Length größer ist als 40 000 Bytes. Geben Sie lediglich die Attribute Name und Length aus und sortieren Sie die Ausgabe nach der Länge. Exportieren Sie  die Liste in eine .csv-Datei.</p>
</li>
<li><p class="first">Geben Sie alle Unterordner bis zu einer bestimmten Tiefe aus, ausgehend vom jeweils aktuellen Ordner</p>
</li>
<li><p class="first">Sie wollen prüfen, ob auf bestimmten Rechnern innerhalb ihres LANs Software bestimmter Herstellner vorhanden ist. Schreiben Sie ein entsprechendes Skript</p>
</li>
<li><p class="first">Erweitern Sie obiges Skript um die Abfrage nach bestimmten Softwarenamen bzw. Versionsständen.</p>
</li>
<li><p class="first">I needed to merge 365 CSV files that represent daily weather data sets into one CSV file that contains all the data accumulated during one year. Each of the daily CSV files had a header row. The yearly file should only have one. Filtering out rows is a perfect application of the PowerShell filter functions. Übersetzen Sie den anglischen Text sinngemäß und schreiben Sie ein entsprechendes Skript.</p>
</li>
<li><p class="first">Suchen Sie die letzten 2000 Systemereignisse des Eventlogs, die vom Typ &#8220;Error&#8221; sind</p>
</li>
<li><p class="first">Sie schreiben ein Powershell-Skript, welches eine eigene Ereignisquelle im Eventlog schafft und darunter seine Ereignisse schreibt.</p>
</li>
<li><p class="first">Schreiben Sie die Einträge der obigen Quelle in eine CSV-Datei. Es soll nur die jeweils letzte Stunde eingetragen werden</p>
</li>
<li><p class="first">A Real-life Example of Select-String</p>
<p>My practical problem was that I wanted to search for instances a particular string in a directory with hundreds of file.  If a file had duplicate entries, then I needed to know.</p>
<p>The PowerShell problem is how to create a stream of the files, then compare each file with my string value.  In the output I needed to know the filename.</p>
<p>To solve the problem, I employed four main commands, which you can see in the following script:</p>
</li>
<li><p class="first">Auflöung einer IP-Range in deren Namen</p>
<blockquote>
<div><p>Erstellen Sie ein Skript, welches eine vordefinierte IP-Range durchläuft und zu jeder IP-Adresse bei Erreichbarkeit den Rechnernamen ausgibt.</p>
<p>Versuchen Sie dabei mögliche Fehleingaben durch Programmierlogik abzufangen</p>
<p>Speichern Sie anschließend die Kombination von IP-Adresse und Rechnername in  einer CSV-Datei</p>
<p>Für die Implementierung können Sie folgende Funktionalität benutzen:</p>
<p>Test-Connection:
Cmdlet, welches die Erreichbarkeit eines Rechners zurückgibt</p>
<p>[System.Net.Dns]::GetHostbyAddress($IPAddress)
Funktionalität des .net-Frameworks, welches eine Namensauflösung für eine gegebene IP-Adresse vornimmt.</p>
</div></blockquote>
</li>
<li><p class="first">Laptop oder Desktop</p>
<blockquote>
<div><p>Sie sind die IT-Leiter einer kleinen mittelständischen Firma. Sie müssen Inventur machen und Sie brauchen dazu die Anzahl der zur Zeit sich im Netz befindlichen Laptop-und Desktop-Computer in ihrer Firma.</p>
<p>Um eine weitere Verarbeitung der Daten zu ermöglichen, sollte Sie den Computernamen, seine IP-Adresse, die Uhrzeit sowie die Aussage, ob es ein Laptop oder Desktop ist, speichern.</p>
<p>Sie planen folgende Vorgehensweise:</p>
<ul class="simple">
<li>Ihr Skript soll während des Login-Vorganges aufgerufen werden. Dies ist von Ihnen nicht zu programmieren.</li>
<li>Das Skript sucht eine Textdatei auf einem Netzlaufwerk und schreibt die entsprechenden Daten in die Datei
Es muss nicht darauf geachtet werden, dass evtl. ein gleichzeitiger Aufruf mehrer Clients möglich wäre.</li>
<li>Falls ihr Rechner in der Datei schon existiert, sollen die Daten    aktualisiert werden</li>
<li>Am Ende soll die Anzahl der Laptop- und Desktop-PC ermittelt und ausgegeben werden. Dies würde typischerweise in einem zweiten Skript stattfinden; sie können dies aber aus Vereinfachungsgründen auch in ihre vorhandene Lösung einbauen.</li>
</ul>
</div></blockquote>
</li>
<li><p class="first">Authentifizierung am Radius-Server</p>
<blockquote>
<div><p>Eine Schule plant, seinen Schülern einen definierten Gast-Zugang zum Internet mit eingeschränkten Rechten (http) per WLAN anzubieten. Dazu müssen die Access-Points mit den jeweiligen Login-Daten der Gäste versehen sein. Dies wird an den Access-Points mit Hilfe von Textdateien (CSV) realisiert, die den Usernamen, Passwort sowie das Datum der Erstellung beinhalten. Neue Gäste sollen jederzeit zu den bestehenden Gastzugängen hinzugefügt werden können. Diese müssen dann in die Textdatei aufgenommen werden; die Textdatei wird anschließend auf dem Accesspoint übeschrieben.</p>
<p>An den Login-Namen wird folgende Anforderung gestellt:
Erster Buchstabe des Vornamens + Nachname</p>
<p>Das Passwort hat folgenden Aufbau:</p>
<p>gast + 4 stellige Zufallszahl</p>
<p>Das Datum soll im Format dd.mm.yyyy in der Textdatei gespeichert werden</p>
<p>Zur ersten Befüllung der Textdatei hat der Systemadministrator eine Textdatei mit dem Vornamen und Nachnamen der Schüler aus dem Acitve Directory extrahiert.</p>
<p>Aufgabe:</p>
<p>Erstellen Sie die Textdatei für die Authentifizierung am Access-Point.</p>
</div></blockquote>
</li>
</ul>
</div>
<div class="section" id="objekte">
<h2>13.12. Objekte<a class="headerlink" href="#objekte" title="Permalink zu dieser Überschrift">¶</a></h2>
<div class="section" id="aufgabe-1">
<h3>13.12.1. Aufgabe 1<a class="headerlink" href="#aufgabe-1" title="Permalink zu dieser Überschrift">¶</a></h3>
<p>Passen Sie das folgende Skriot so an, dass die Informationen nicht lediglich per Write-Host ausgegeben werden, sondern in Form eines Objektes gespeichert werden.</p>
<div class="highlight-sh"><div class="highlight"><pre>        Function SysInfo
<span class="o">{</span>
        <span class="nv">$colItems</span> <span class="o">=</span> Get-WmiObject Win32_ComputerSystem <span class="sb">`</span>
        -Namespace <span class="s2">&quot;root\CIMV2&quot;</span> -ComputerName <span class="nv">$strComputer</span>

        foreach<span class="o">(</span><span class="nv">$objItem</span> in <span class="nv">$colItems</span><span class="o">)</span> <span class="o">{</span>
          Write-Host <span class="s2">&quot;Computer Manufacturer: &quot;</span> <span class="nv">$objItem</span>.Manufacturer
          Write-Host <span class="s2">&quot;Computer Model: &quot;</span> <span class="nv">$objItem</span>.Model
          Write-Host <span class="s2">&quot;Total Memory: &quot;</span> <span class="nv">$objItem</span>.TotalPhysicalMemory <span class="s2">&quot;bytes&quot;</span>
        <span class="o">}</span>
<span class="o">}</span>

Function BIOSInfo <span class="o">{</span>

        <span class="nv">$colItems</span> <span class="o">=</span> Get-WmiObject Win32_BIOS -Namespace <span class="s2">&quot;root\CIMV2&quot;</span> <span class="sb">`</span>
        -computername <span class="nv">$strComputer</span>
        foreach<span class="o">(</span><span class="nv">$objItem</span> in <span class="nv">$colItems</span><span class="o">)</span> <span class="o">{</span>
                Write-Host <span class="s2">&quot;BIOS:&quot;</span><span class="nv">$objItem</span>.Description
                Write-Host <span class="s2">&quot;Version:&quot;</span><span class="nv">$objItem</span>.SMBIOSBIOSVersion<span class="s2">&quot;.&quot;</span>
                <span class="nv">$objItem</span>.SMBIOSMajorVersion<span class="s2">&quot;.&quot;</span><span class="nv">$objItem</span>.SMBIOSMinorVersion
                Write-Host <span class="s2">&quot;Serial Number:&quot;</span> <span class="nv">$objItem</span>.SerialNumber
        <span class="o">}</span>
<span class="o">}</span>


Function OSInfo
<span class="o">{</span>
        <span class="nv">$colItems</span> <span class="o">=</span> Get-WmiObject Win32_OperatingSystem -Namespace <span class="sb">`</span> <span class="s2">&quot;root\CIMV2&quot;</span> -Computername <span class="nv">$strComputer</span>

        foreach<span class="o">(</span><span class="nv">$objItem</span> in <span class="nv">$colItems</span><span class="o">)</span> <span class="o">{</span>
                Write-Host <span class="s2">&quot;Operating System:&quot;</span> <span class="nv">$objItem</span>.Name
        <span class="o">}</span>
<span class="o">}</span>


Function CPUInfo
<span class="o">{</span>
        <span class="nv">$colItems</span> <span class="o">=</span> Get-WmiObject Win32_Processor -Namespace <span class="sb">`</span>
        <span class="s2">&quot;root\CIMV2&quot;</span> -Computername <span class="nv">$strComputer</span>

        foreach<span class="o">(</span><span class="nv">$objItem</span> in <span class="nv">$colItems</span><span class="o">)</span> <span class="o">{</span>
                Write-Host <span class="s2">&quot;Processor:&quot;</span> <span class="nv">$objItem</span>.DeviceID <span class="nv">$objItem</span>.Name
        <span class="o">}</span>
<span class="o">}</span>


Function DiskInfo
<span class="o">{</span>
        <span class="nv">$colItems</span> <span class="o">=</span> Get-WmiObject Win32_DiskDrive -Namespace <span class="s2">&quot;root\CIMV2&quot;</span> <span class="sb">`</span> -ComputerName <span class="nv">$strComputer</span>

        foreach<span class="o">(</span><span class="nv">$objItem</span> in <span class="nv">$colItems</span><span class="o">)</span> <span class="o">{</span>
                Write-Host <span class="s2">&quot;Disk:&quot;</span> <span class="nv">$objItem</span>.DeviceID
                Write-Host <span class="s2">&quot;Size:&quot;</span> <span class="nv">$objItem</span>.Size <span class="s2">&quot;bytes&quot;</span>
                Write-Host <span class="s2">&quot;Drive Type:&quot;</span> <span class="nv">$objItem</span>.InterfaceType
                Write-Host <span class="s2">&quot;Media Type: &quot;</span> <span class="nv">$objItem</span>.MediaType
        <span class="o">}</span>
<span class="o">}</span>


Function NetworkInfo
<span class="o">{</span>
        <span class="nv">$colItems</span> <span class="o">=</span> Get-WmiObject Win32_NetworkAdapterConfiguration <span class="sb">`</span> -Namespace <span class="s2">&quot;root\CIMV2&quot;</span> -ComputerName <span class="nv">$strComputer</span> | where<span class="o">{</span><span class="nv">$_</span>.IPEnabled -eq <span class="s2">&quot;True&quot;</span><span class="o">}</span>

        foreach<span class="o">(</span><span class="nv">$objItem</span> in <span class="nv">$colItems</span><span class="o">)</span> <span class="o">{</span>
                Write-Host <span class="s2">&quot;DHCP Enabled:&quot;</span> <span class="nv">$objItem</span>.DHCPEnabled
                Write-Host <span class="s2">&quot;IP Address:&quot;</span> <span class="nv">$objItem</span>.IPAddress
                Write-Host <span class="s2">&quot;Subnet Mask:&quot;</span> <span class="nv">$objItem</span>.IPSubnet
                Write-Host <span class="s2">&quot;Gateway:&quot;</span> <span class="nv">$objItem</span>.DefaultIPGateway
                Write-Host <span class="s2">&quot;MAC Address:&quot;</span> <span class="nv">$ojbItem</span>.MACAddress
        <span class="o">}</span>
<span class="o">}</span>


<span class="c">#*=============================================================</span>
<span class="c">#* SCRIPT BODY</span>
<span class="c">#*=============================================================</span>
<span class="c">#* Connect to computer</span>
<span class="nv">$strComputer</span> <span class="o">=</span> <span class="s2">&quot;.&quot;</span>

<span class="c">#* Call SysInfo Function</span>
Write-Host <span class="s2">&quot;Sytem Information&quot;</span>
SysInfo
Write-Host

<span class="c">#* Call BIOSinfo Function</span>
Write-Host <span class="s2">&quot;System BIOS Information&quot;</span>
BIOSInfo
Write-Host

<span class="c">#* Call OSInfo Function</span>
Write-Host <span class="s2">&quot;Operating System Information&quot;</span>
OSInfo
Write-Host

<span class="c">#* Call CPUInfo Function</span>
Write-Host <span class="s2">&quot;Processor Information&quot;</span>
CPUInfo
Write-Host

<span class="c">#* Call DiskInfo Function</span>
Write-Host <span class="s2">&quot;Disk Information&quot;</span>
DiskInfo
Write-Host

<span class="c">#* Call NetworkInfo Function</span>
Write-Host <span class="s2">&quot;Network Information&quot;</span>
NetworkInfo
Write-Host
</pre></div>
</div>
</div>
<div class="section" id="aufgabe-2">
<h3>13.12.2. Aufgabe 2<a class="headerlink" href="#aufgabe-2" title="Permalink zu dieser Überschrift">¶</a></h3>
<p>Ihn ihrer Firma wird ein Skript genutzt, welches die Aufrufe der einzelnen Webseiten pro Wochentag aus den Log-Files des Webservers erstellt und in einer Datei &#8220;weekly_Stats.csv&#8221; speichert.</p>
<p>Die Struktur der Datei sieht wie folgt aus:</p>
<p>site_url, monday, tuesday, wednesday, thursday, friday, saturday, sunday
index.php,20000,14324,23453,43213,56432,23451,12343
login/login.php, 23432,34321,34567,43567,5432,43256,0
login/logout.php,12345,22345,32456,4232,3453,23456,1234
....</p>
<p>Insgesamt ist von ca 700 Zeilen in der Datei auszugehen.</p>
<p>Ihr Chef möchte nun als weitere Information für die jeweiligen urls den wöchentlichen Durchschnitt pro url berechnet bekommen und eine nach dem Durchschnitt sortierte Ausgabe in einer Textdatei speichern.</p>
<p>Erstellen Sie ein entsprechendes Skript. Benutzen Sie wenn möglich objektorientierte Ansätze sowie die Pipeline.</p>
</div>
<div class="section" id="aufgabe-3">
<h3>13.12.3. Aufgabe 3<a class="headerlink" href="#aufgabe-3" title="Permalink zu dieser Überschrift">¶</a></h3>
<p>Gegeben ist folgendes PS-Skript.</p>
<div class="highlight-sh"><div class="highlight"><pre>Function Get-NetworkConfiguration
<span class="o">{</span>
    param <span class="o">(</span>
        <span class="o">[</span>parameter<span class="o">(</span>
            <span class="nv">ValueFromPipeline</span><span class="o">=</span><span class="nv">$true</span>,
            <span class="nv">ValueFromPipelineByPropertyName</span><span class="o">=</span><span class="nv">$true</span>,
            <span class="nv">Position</span><span class="o">=</span>0<span class="o">)]</span>
        <span class="o">[</span>Alias<span class="o">(</span><span class="s1">&#39;__ServerName&#39;</span>, <span class="s1">&#39;Server&#39;</span>, <span class="s1">&#39;Computer&#39;</span>, <span class="s1">&#39;Name&#39;</span><span class="o">)]</span>
        <span class="o">[</span>string<span class="o">[]]</span>
        <span class="nv">$ComputerName</span> <span class="o">=</span> <span class="nv">$env</span>:COMPUTERNAME,
        <span class="o">[</span>parameter<span class="o">(</span><span class="nv">Position</span><span class="o">=</span>1<span class="o">)]</span>
        <span class="o">[</span>System.Management.Automation.PSCredential<span class="o">]</span>
        <span class="nv">$Credential</span>
    <span class="o">)</span>
    process
    <span class="o">{</span>
        <span class="nv">$WMIParameters</span> <span class="o">=</span> @<span class="o">{</span>
            <span class="nv">Class</span> <span class="o">=</span> <span class="s1">&#39;Win32_NetworkAdapterConfiguration&#39;</span>
            <span class="nv">Filter</span> <span class="o">=</span> <span class="s2">&quot;IPEnabled = &#39;true&#39;&quot;</span>
            <span class="nv">ComputerName</span> <span class="o">=</span> <span class="nv">$ComputerName</span>
        <span class="o">}</span>

        <span class="k">if</span> <span class="o">(</span><span class="nv">$Credential</span> -ne <span class="nv">$Null</span><span class="o">)</span>
        <span class="o">{</span>
            <span class="nv">$WmiParameters</span>.Credential <span class="o">=</span> <span class="nv">$Credential</span>
        <span class="o">}</span>
        foreach <span class="o">(</span><span class="nv">$adapter</span> in <span class="o">(</span>Get-WmiObject @WMIParameters<span class="o">))</span>
        <span class="o">{</span>
            <span class="nv">$OFS</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span>
            Write-Host <span class="s2">&quot;Server: $($adapter.DNSHostName)&quot;</span>
            Write-Host <span class="s2">&quot;Adapter: $($adapter.Description)&quot;</span>
            Write-Host <span class="s2">&quot;IP Address: $($adapter.IpAddress)&quot;</span>
            Write-Host <span class="s2">&quot;Subnet Mask: $($adapter.IPSubnet)&quot;</span>
            Write-Host <span class="s2">&quot;Default Gateway: $($adapter.DefaultIPGateway)&quot;</span>
            Write-Host <span class="s2">&quot;DNS Servers: $($adapter.DNSServerSearchOrder)&quot;</span>
            Write-Host <span class="s2">&quot;DNS Domain: $($adapter.DNSDomain)&quot;</span>
            Write-Host
        <span class="o">}</span>

    <span class="o">}</span>
<span class="o">}</span>
</pre></div>
</div>
<ul>
<li><p class="first">Wählen Sie statt der Write-Host-Ausgabe einen objektorientierten Ansatz</p>
</li>
<li><p class="first">Sie wollen nicht alle Informationen ausgeben, sondern beispielsweise nur die IP-Adresse und die Subnet-Maske</p>
</li>
<li><p class="first">Können Sie mit diesem Skript mehrere Rechner abfragen ?</p>
</li>
<li><p class="first">Welche Rechner ihres Netzes benutzen den gleichen DNS-Server mit der
IP-Adresse <strong>*.*</strong>.***.***. Eine Liste der Computer erhalten Sie mit Hilfe des CommandLets get-adcomputer</p>
</li>
<li><p class="first">Wie viele Rechner benutzen den gleichen Default-Gateway</p>
</li>
<li><p class="first">Übersetzen Sie den folgenden Text:</p>
<blockquote>
<div><p>When you begin to output options from your functions, the reusability and extensibility options soar. Objects allow you to take advantage of the pipeline (which allows your objects to be the input to other commands), allow your commands to use incoming objects (via the Parameter attribute and ValueFromPipelineByPropertyName switch), and most importantly, allow you to leverage the formatting and output system that Windows PowerShell provides, which keeps you from having to design your own output options and saves your effort for the real work—getting your job done!</p>
</div></blockquote>
</li>
</ul>
</div>
</div>
<div class="section" id="fehlerbehandlung">
<h2>13.13. Fehlerbehandlung<a class="headerlink" href="#fehlerbehandlung" title="Permalink zu dieser Überschrift">¶</a></h2>
</div>
<div class="section" id="active-directory">
<h2>13.14. Active Directory<a class="headerlink" href="#active-directory" title="Permalink zu dieser Überschrift">¶</a></h2>
<ul class="simple">
<li>Sie planen das E-Learning-System Moodle (<a class="reference external" href="http://www.moodle.org">http://www.moodle.org</a>) zu installieren. Um die Benutzerverwaltung zu vereinfachen planen Sie, die User aus dem ActiveDirectory ihrer Windows-Domäne als Benutzer in mysql anzulegen. Schreiben Sie ein entsprechendes Skript.</li>
</ul>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Allgemeiner Index"
             >Index</a></li>
        <li class="right" >
          <a href="Loesungen.html" title="14. Lösungen"
             >weiter</a> |</li>
        <li class="right" >
          <a href="powershell_customobjects.html" title="12. Objekte in der PS"
             >zurück</a> |</li>
        <li><a href="index.html">PS4SYS</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2010, STE.
      Mit <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1 erstellt.
    </div>
  </body>
</html>